
package com.ys.chatserver.http.file.u;

import com.eva.framework.utils.LoggerFactory;
import com.ys.chatserver.BaseConf;
import com.ys.chatserver.tool.ImgEqualScaleAndCutHelper;

import java.io.File;
import java.util.HashMap;

/**
 * 我的相册中的图片文件上传处理实现类。
 *
 * @author Json
 */
public class MyPhotoUploder extends UploaderRoot {
    @Override
    protected String getFileSaveDir() {
        return BaseConf.getInstance().getDIR_USER_PHOTO_UPLOAD();
    }

    @Override
    protected void onUploadSucess(HashMap<String, Object> parametersFromClient) throws Exception {
        String userUid = (String) parametersFromClient.get("user_uid");
        // 因为服务端是支持多文件上传的API，所以客户端单独把文件名带过来了，方便使用！
        String fileName = (String) parametersFromClient.get("file_name");
        // 客户端传过来的token，用于请求的合法性检查，当前未作强制检查，留作以后使用
        String token = (String) parametersFromClient.get("token");

        LoggerFactory.getLog().debug("[" + getDebugTAG() + "] 用户" + userUid + "的照片文件" + fileName
                + "数据上传成功，马上处理其它业务逻辑...(token=" + token + ")");

        // 客户端传过来的数据（参数）的合法性检查
        if (userUid != null && fileName != null) {
            String uploadPath = getFileSaveDir();
            // 图片文件已经保存到的磁盘绝对路径
            File filePath = new File(uploadPath + File.separator + fileName);

            if (filePath.exists()) {
                // 生成原图的缩略图并存到磁盘
                File thumbnailFilePath = new File(uploadPath + File.separator + "th_" + fileName);
                // 如果该md5文件名命名（其实此md5码就是文件数据的指纹）存在，即意味着不需要写入磁盘了
                if (!thumbnailFilePath.exists()) {
                    // 如果是照片则启用新的等经缩放并裁切的算法（此算法自2014-03-29实施），算法将保证缩略图的生成不变形
                    try {
                        ImgEqualScaleAndCutHelper.saveImageAsJpg(filePath.getAbsolutePath(), thumbnailFilePath.getAbsolutePath()
                                , 245, 245 // 生成的缩略图参考QQ空间的按245*245的极限缩放
                        );
                    } catch (Exception e) {
                        LoggerFactory.getLog().warn("[" + getDebugTAG() + "] 图片缩略图生成（新算法不可靠，需优化？）出错了！", e);
                    }
                }

                // 如果上传的是用户照片，则同时要插入一条数据到db中

            } else {
                LoggerFactory.getLog().error("[" + getDebugTAG() + "] 用户" + userUid + "的照片文件" + fileName + "为何不存在？(绝对路径=" + filePath.getAbsolutePath() + ")");
            }
        } else {
            throw new Exception("[" + getDebugTAG() + "] 无效的参数：userUid=" + userUid + ", fileName=" + fileName + ".");
        }
    }

    @Override
    protected void onUploadFailure(Exception ex) {
        LoggerFactory.getLog().error("[" + getDebugTAG() + "] 处理照片上传时出错了，" + ex.getMessage(), ex);
    }

    @Override
    protected String getDebugTAG() {
        return "HTTP照片上传";
    }
}

